一、ES6新增了let命令
let 和 var 一样都是用来声明标量,但let所声明的变量只在【声明的代码块内】及【声明之后】有效
{
console.log(a); // undefined
console.log(b); // Uncaught ReferenceError: b is not defined(…)
var a = 5;
let b = 10;
}
console.log(a); // 5
console.log(b); // Uncaught ReferenceError: b is not defined(…)
let命令适合在for循环中使用
// i在for循环内有效
for(let i = 0;i < 5;i++){
console.log(i); // 0 1 2 3 4
}
console.log(i); // Uncaught ReferenceError: i is not defined(…)
//i在全局内有效
for(var i = 0;i < 5;i++){
console.log(i); // 0 1 2 3 4
}
console.log(i); // 5
let 命令暂时性死区
// 大括号中的a使用了let声明,所以 a在大括号中暂时只能在声明之后有效
var a = 5;
{
console.log(a); // Uncaught ReferenceError: a is not defined(…)
typeof a; // Uncaught ReferenceError: a is not defined(…)
let a =10;
console.log(a); // 10
}
console.log(a); // 5
let不允许在同一作用域内重复声明变量,因此不能在函数内重新声明变量
{
let a = 10;
var a = 15; //Uncaught SyntaxError: Identifier 'a' has already been declared
}
{
var a = 10;
var a = 15; // 不会报错
console.log(a); // 15
}
show(10);
function show(arg){
let arg = 5; //Uncaught SyntaxError: Identifier 'arg' has already been declared(…)
console.log(arg);
}
hide(10);
function hide(arg){
{
let arg = 5;
console.log(arg); // 5
}
console.log(arg); // 10
}
二、ES6新增了块级作用域
ES5只有全局作用域和函数作用域,会出现以下的问题
//1、内层变量覆盖了外层变量
var number = 5;
show();
function show(){
console.log(number); // undefined
var number = 10 ;
}
//2、i泄露成全局变量
var string = 'hello';
for(var i = 0 ;i<string.length ;i++){
console.log(string[i]); // h e l l o
}
console.log(i); // 5
ES6块级作用域写法(块级作用域可以无限嵌套,可以代替ES5的匿名函数IIFE)
{
let number = 5;
console.log(number); // 5
{
let number = "hello";
console.log(number); // hello
}
}
ES5严格模式下,函数不能在块级中声明,ES6明确规定可以在块级作用域中声明函数,但声明的函数有点类似let,在块级作用域之外不可引用,由于浏览器可以忽略以上规则,所以尽量避免在块级作用域中声明函数。
//ES5非严格模式
if(true){
function show(){ //不报错
};
}
//ES5严格模式
'use strict';
if(true){
function show(){ //直接报错
};
}
//ES6严格模式
'use strict';
if(true){
function show(){ //不报错
};
}
三、ES6新增了const命令
const 声明的是一个只读的变量,一旦声明,不可更改,这就意味着一旦声明就必须初始化,不然会报错,const作用域和let作用域一样.
const PI; //Uncaught SyntaxError: Missing initializer in const declaration
const PI = 3.1415926;
console.log(PI); // 3.1415926;
PI = 4 ; // Uncaught TypeError: Assignment to constant variable.
//const声明的变量也和let一样,不能重复声明
var a = 1;
let b = 2;
const a = 5; //Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 6 ; //Uncaught SyntaxError: Identifier 'b' has already been declared
//对于复合对象,变量名指向的是数据的地址,const声明的指向的是数据的地址不变,但数据可以变;若要冻结数据,可以使用freeze.
const A = {};
A.props = 123;
console.log(A.props); // 123
A = {}; // Uncaught TypeError: Assignment to constant variable.
const B = Object.freeze({});
B.props = 456; // 常规模式,该行代码无效,严格模式下会报错
console.log(B.props); // undefined
全局变量的属性
window.a = 1;
var a = 2 ;
console.log(a); // 2
console.log(window.a); // 2
window.b = 1;
let b = 2 ;
console.log(b); // 2
console.log(window.b); // 1
总结:
ES5 有两种声明变量的方法:var 和 function命令
ES6 有六种声明变量的方法:var 、 function 、let 、const 、import、class命令。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。